/********************************Copyright (c)**********************************\
**
**                   (c) Copyright 2025, Main, China, QD.
**                           All Rights Reserved
**
**                                By(wo4fisher)
**                           http://www.wo4fisher.com
**
**----------------------------------文件信息------------------------------------
** 文件名称: water_system.h
** 创建人员: wht
** 创建日期: 2025-08-14
** 文档描述: 
**
**----------------------------------版本信息------------------------------------
** 版本代号: V0.1
** 版本说明: 初始版本
**
**------------------------------------------------------------------------------
\********************************End of Head************************************/
 
#ifndef __WATER_SYSTEM_H_
#define __WATER_SYSTEM_H_
#include "main.h"
#include "spi.h"
#include "adc.h"
#include "dac.h"
#include "dma.h"
#include "buttonPort.h"
#include <stdint.h>
#include "debug.h"
#include "rc522.h"
#include "usart.h"

// 主状态枚举
typedef enum {
    STATE_WAIT_CARD = 0,        // 等待刷卡状态
    STATE_WAIT_KEY,             // 等待按键状态
    STATE_WATER_DISPENSING,     // 取水状态
    STATE_SHOW_RESULT           // 显示结果状态
} main_state_t;

// 子状态枚举（用于取水状态的详细控制）
typedef enum {
    SUBSTATE_WAIT_UV_CHECK = 0, // 等待UV检测
    SUBSTATE_UV_ON,             // UV灯开启
    SUBSTATE_NORMAL_DISPENSING  // 正常取水中
} water_substate_t;

// 状态机结构体
typedef struct {
    main_state_t current_state;         // 当前主状态
    water_substate_t water_substate;    // 取水子状态
    uint32_t state_entry_count;         // 状态进入计数值
    uint32_t card_id;                   // IC卡号
    float water_volume;                 // 当次取水量
    uint8_t uv_intensity_percent;       // UV强度百分比 即目标值(0-100%)
    uint8_t uv_lamp_on;                 // UV灯状态
    uint8_t uv_cur_percent;             // UV当前百分比，逐步上升或下降
} state_machine_t;

// 配置参数（基于100ms任务周期的计数值）
#define MAIN_TASK_PERIOD  20
#define KEY_TIMEOUT_COUNT       (10000/20)     // 按键超时计数（100 * 100ms = 10秒）
#define SHOW_RESULT_COUNT       (10000/20)     // 显示结果计数（50 * 100ms = 5秒）
#define UV_CHECK_COUNT          (5000/20)      // UV检测延时计数（30 * 100ms = 3秒）
#define UV_PERCENT_STEP         5              // UV强度步进值


// 全局变量声明
extern state_machine_t g_state_machine;
extern volatile uint32_t pf_pulse_count;
extern uint32_t pf_session_start_count;
extern float pf_pulse_per_liter;
extern volatile uint8_t adc_conv_flag; // ADC dma转换完成标志
extern volatile uint8_t uart3_txc_flag; // 向hmi传输完成标志

// 函数声明
void water_system_init(void);
void state_machine_run(void);
uint32_t get_task_cycle_count(void);
uint32_t get_state_elapsed_count(void);
void increment_task_cycle_count(void);
main_state_t get_current_state(void);
float get_current_water_volume(void);
void force_return_to_initial_state(void);


// 硬件接口函数声明
void pf_start_water_session(void);
float pf_get_session_volume(void);
void water_valve_control(uint8_t state);
void uv_intensity_set_percent(uint8_t percent);
float get_uv_illuminance(void);                 //从adc计算强度值
void display_show_card_id(uint32_t card_id);
void display_show_water_volume(float volume);
void display_show_water_price(float volume);

void display_clear(void);
void display_show_message(const char* msg);


/*-------------- 1 VALVE ---------------*/
void valve_gpio_init(void);
void valve_set_open(void);
void valve_set_close(void);
void valve_set_free(void);

/*-------------- 2 UVC -----------------*/
// 定义状态变量，记录uvc启停状态
void uvc_init(void);   // gpio dac adc
uint8_t uvc_pwr_on(void);  // rturn 1
uint8_t uvc_pwr_off(void);  //return 0
void uvc_intensity_process(void); // 根据全局变量，逐步提高或降低uv强度

/*-------------- 3 HMI -----------------*/

//循环缓冲区，数据接收、解析

// 向HMI发送数据，提供字符串和字符串长度（不含结束标志）
void send_str_hmi(uint8_t *pBuf, uint8_t len);
/*-------------- 4 BUTTON --------------*/

/*-------------- 5 ic_card ----------------*/

/*-------------- 6 PF ------------------*/
void pf_init(void);
void pf_clear_pulse_count(void);

/*-------------- 7 BEEP ------------------*/
void beep_gpio_init(void);
void beep_on(uint8_t period);
void beep_reset(void);
void beep_process(void);

void led_init(void);
void led_toggle(void);


#endif

 
/********************************End of File************************************/